#ifndef _Coordenada_h
#define _Coordenada_h
#include "ExcepcionSVG.h"
using namespace std;

/** \file Coordenada.h
* \brief Clase Coordenada
*
* Defincion de clase Coordenada.
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/


/** \brief Clase Coordenada, define estos objetos.
 *
 * La clase coordenada define el comportamiento de los objetos pertenecientes a esta clase, tenemos que esta compuesto por
 * dos variables, x e y, para situar la coordenada, sus constructores y diversos procedimientos.
 */
class Coordenada
{
	/** \brief Función amiga, sobrecarga del operador >>
	*
	* Lee de un fichero un string con dos coordenadas separadas por un espacio, ejemplo: "567 878". El método extrae esta información y la guarda en la coordenada que le pasamos por parámetro.
	* \param is Tipo istream&.
	* \param c Tipo Coordenada&
	* \return istream&
	*/
	friend istream& operator>>( istream &, Coordenada &);

	/** \brief Función amiga, sobrecarga del operador >>
	*
	* Escribe en un os, la información sobre la Coordenada c según el formato que le damos en la implementación.
	* \param os Tipo ostream&.
	* \param c Tipo Coordenada&
	* \return ostream&
	*/
	friend ostream& operator<<( ostream &, const Coordenada &);

	public:


		/** \brief Constructor de objeto Coordenada.
		*
		* Pasadas dos coordenadas construye el objeto con esas coordenadas.
		* \param x Coordenada X.
		* \param y Coordenada Y.
		*/
		Coordenada( float x = 0.0, float y = 0.0);

		/** \brief Constructor de copia.
		*
		* Pasado un objeto crea uno igual a este sin alterarlo.
		* \param coor el objeto de tipo const Coordenada.
		*/
		Coordenada( const Coordenada & );


		/** \brief Destructor de objeto Coordenada.
		*
		* Se ejecuta cuando hace falta destruir un objeto asignando a sus coordenadas ceros.
		*/
		~Coordenada();

		/** \brief Sobrecarga del operador =
		*
		* Pasado un objeto crea uno igual a este sin alterarlo.
		* \param coor Un objeto de tipo Coordenada, pasado como constante.
		* \return *this un objeto de clase Coordenada.
		*/
		Coordenada& operator=(const Coordenada & );

		/** \brief Devuelve una coordenada.
		*
		* Devuelve el valor de la coordenada X declarada en la clase Coordenada.
		*
		* \return x la coordenada X.
		*/
		float getX( ) const;

		/** \brief Devuelve una coordenada.
		*
		* Devuelve el valor de la coordenada Y declarada en la clase Coordenada.
		*
		* \return y la coordenada Y.
		*/
		float getY( ) const;

		/** \brief  Sobrecarga del operador comparación "==": operator==.
		 *
		 *	Devuelve true si tenemos dos coordenadas iguales, false si es distinto:
		 *	\param c Recibe un objeto tipo Coordenada como constante.
		 *	\return Devuelve un booleano, true si los objetos son iguales, false si no.
		 */
		bool operator==( const Coordenada & ) const;

		/** \brief Imprime coordenadas.
		*
		* Imprime en el fichero que le pasemos las coordenadas que correspondan al objeto.
		* \param os Tipo ostream que le pasaremos por referencia a la función para escribir en el mismo.
		* \return No devuelve ningún parámetro.
		*/
		void imprimir(ostream &) const;

		/** \brief Sobrecarga del operador +
		 *
		 * 	Suma el valor de dos coordenadas, la que llame al método con la que le pasamos, si el valor de la suma excede al impuesto por los limites del lienzo devolveremos un valor error.
		 * \param c Objeto tipo cons Coordenada&.
		 * \return El método nos devuelve una coordenada resultante de la operación
		 */
		Coordenada operator+(const Coordenada &) const;

		/** \brief Sobrecarga del operador -
		 *
		 * 	Resta el valor de dos coordenadas, la que llame al método con la que le pasamos, si el valor de la resta excede al impuesto por los limites del lienzo devolveremos un valor error.
		 * \param c Objeto tipo cons Coordenada&.
		 * \return El método nos devuelve una coordenada resultante de la operación
		 */
		Coordenada operator-(const Coordenada &) const;

		/** \brief Sobrecarga del operador *
		 *
		 * 	Multiplica el valor de la coordenada con un float, la que llame al método con la que le pasamos, si el valor de la multiplicacion excede al impuesto por los limites del lienzo devolveremos un valor error.
		 * \param factor float por el que multiplicar.
		 * \return El método nos devuelve una coordenada resultante de la operación
		 */
		Coordenada operator*(float) const;

	private:

		/** \brief Variable x.
		 *
		 *	Define el valor de una coordenada x
		 */
		float x;
		/** \brief Variable y.
		 *
		 *	Define el valor de una coordenada ys
		 */
		float y;

};

#endif /* COORDENADA_H_ */
